"""
@name : 05.类的继承
@author : wenyao
@projectname: xsfh
"""

#封装  将数据和函数做了一层封装，封装成类，使用者不需要管具体实现的代码
#继承
#多态
class Animal():
    species = "Animal"
    count = 0
    def __init__(self):
        self.name = "animal"
        Animal.count +=1
        print("初始化animal.....")
    def breath(self):
        print("i can breath")
    def eat(self):
        print("i can eat")

#i can play, i can fly, i believe i can touch the sky
class Person(Animal):
    species = "Person"  #重写父类的属性

class Dog(Animal):
    def __init__(self):  #重写父类的__init__
        print("i am dog")
    def eat(self):       #重写父类的eat
        print("dog is eating....")

class Pig(Animal):
    count = 0       #重写父类的属性
    def __init__(self): #重写父类的__init__
        #super 一般写在前面，这样子不会因为父类属性覆盖子类属性
        super().__init__() #子类访问父类的方法属性， 去执行父类的__init__
        self.name = "pig"
        Pig.count +=1
        print("初始化pig")
        #super().__init__()
        #等效于执行了下面这些语句
        # self.name = "animal"
        # Animal.count += 1
        # print("初始化animal.....")

#Animal.__init__(animal)
animal = Animal()
print(Animal.count, animal.count)

#Person.__init__(person)
person = Person()
#继承父类的属性和方法
#对象属性查找，先在实例空间超，没有就去类空间
#类空间没有就去父类空间，层层网上递归查找
print(person.species, person.count, Person.count)
print("*"*40)
dog = Dog()
print(dog.count)
dog.eat()
dog.breath()
print("#"*40)
pig = Pig()
print(pig.count, pig.name)

#################类与实例的关系###############
print("类与实例的关系".center(30,"*"))
print(type(dog))
print(isinstance(dog,Dog), isinstance(dog, Animal))


#迭代器
#__iter__  方法返回自身
#   return self
#__next__  返回下一个值

#最后实例化成一个迭代器对象 斐波那契数列
#自定义异常类  -- 继承exception